
class InstituicaoEnsinoController {

    def springSecurityService
    ConvenioService convenioService;

    /*
     * Se a url vier sem action redireciona para a create.
     */
    def index  = {
        if(!verificaLogon()){
            return;
        }
        InstituicaoEnsino instituicaoEnsinoInstance = InstituicaoEnsino.findById(session.pessoa.id);
        def enderecoInstance          = Endereco.findAllByPessoa(session.pessoa)
        def contatoInstance           = Contato.findAllByPessoa(session.pessoa)
        Colaborador colaborador       = Colaborador.findById(session.pessoa.id);
        def responsavelInstance       = Responsavel.findAllByColaborador(colaborador);
        def convenioInstance          = Convenio.findByColaborador(colaborador);
        
        render(view:"index", model:[instituicaoEnsinoInstance : instituicaoEnsinoInstance,
                                    enderecoInstance    : enderecoInstance,
                                    contatoInstance     : contatoInstance,
                                    responsavelInstance : responsavelInstance,
                                    convenioInstance    : convenioInstance]);
    };

    def list   = {
        if(!verificaLogon()){
            return;
        }
        params.max = Math.min(params.max ? params.int('max') : 10, 100);
        
        def ie = InstituicaoEnsino.createCriteria()
        def results = ie.list {  
            if (params.nome) {
                or {
                    like("nome","%" + params.nome + "%") 
                    like("razaoSocial","%" + params.nome + "%")}}
            if (params.id) {eq("id",Long.valueOf(params.id))}
            if (params.cnpj) {eq("cnpjCpf",params.cnpj)}
            
            if (params.max) {maxResults(params.max)}
            if (params.sort) {order(params.sort,params.order)}        
        }
        
        [instituicaoEnsinoInstanceList: results, instituicaoEnsinoInstanceTotal: InstituicaoEnsino.count()]
    }

    /*
     * Closure que carrega a tela de cadastro.
     */
    def create = {
        def instituicaoEnsinoInstance = new InstituicaoEnsino();
        instituicaoEnsinoInstance.properties = params;
        return [instituicaoEnsinoInstance: instituicaoEnsinoInstance];
    }

    /*
     * Closure que grava o registro.
     * Seta a session pessoa e envia para a tela de edição do cadastro para que o usuário possa concluir o cadastro.
     */
    def save   = {
        def instituicaoEnsinoInstance = new InstituicaoEnsino(params);
        instituicaoEnsinoInstance.password = springSecurityService.encodePassword(params.password)
        if (instituicaoEnsinoInstance.save(flush: true)) {
            session.pessoa = instituicaoEnsinoInstance;
            redirect(action: "edit", id: instituicaoEnsinoInstance.id);
        }else {
            render(view:"create",model: [instituicaoEnsinoInstance: instituicaoEnsinoInstance]);
        }
    };

    /*
     * Closure que carrega os dados e exibe um preview.
     */
    def show   = {
        if(!verificaLogon()){
            return;
        }
        def instituicaoEnsinoInstance = InstituicaoEnsino.get(params.id);
        if (!instituicaoEnsinoInstance) {
            flash.message="Instituição de Ensino não encontrada.";
            redirect(action: "list");
        }
        else {
            [instituicaoEnsinoInstance: instituicaoEnsinoInstance];
        }
    };

    /*
     * Closure que carregado os dados da Instituição de Ensino para alteração.
     * Lista os Convênios, Responsáveis, endereços e contatos.
     * Em caso de alteração de um dado dos tipos listados acima, carrega os dados do registro.
     */
    def edit   = {
        if(!verificaLogon()){
            return;
        }
        int totalEndereco    = 0;
        int totalContato     = 0;
        int totalConvenio    = 0;
        int totalResponsavel = 0;
        Colaborador colaboradorInstance = Colaborador.findById(session.pessoa.id);

        // Carrega os dados da Instituição de Ensino.
        def instituicaoEnsinoInstance = InstituicaoEnsino.findById(session.pessoa.id);
        if (!instituicaoEnsinoInstance){
            instituicaoEnsinoInstance   = new InstituicaoEnsino();
        }

        // CONVÊNIOS.
        // Carrega os dados para a alteração do convênio.
        def convenioDadosInstance = '';
        if(params.convenio != null){
            convenioDadosInstance = Convenio.findById(params.convenio);
        }else{
            convenioDadosInstance = new Convenio();
        }
        // Carrega os convênios cadastrados.
        def convenioInstance    = Convenio.findAllByColaborador(session.pessoa);
        if (convenioInstance != null){
            totalContato = convenioInstance.count();
        }else{
            convenioInstance    = new Convenio();
        }

        // RESPONSÁVEL.
        // Carrega os dados para a alteração do responsável.
        def responsavelDadosInstance = '';
        if(params.responsavel != null){
            responsavelDadosInstance = Responsavel.findById(params.responsavel);
        }else{
            responsavelDadosInstance = new Responsavel();
        }
        // Carrega os responsáveis cadastrados.
        def responsavelInstance   = Responsavel.findAllByColaborador(session.pessoa);
        if (responsavelInstance != null){
            totalResponsavel = responsavelInstance.count();
        }else{
            responsavelInstance   = new Responsavel();
        }

        // ENDEREÇOS.
        // Carrega os dados para a alteração do endereço.
        def enderecoDadosInstance = '';
        if(params.endereco != null){
            enderecoDadosInstance = Endereco.findById(params.endereco);
        }else{
            enderecoDadosInstance = new Endereco();
        }
        // Carrega os endereços cadastrados.
        def enderecoInstance   = Endereco.findAllByPessoa(session.pessoa);
        if (enderecoInstance != null){
            totalEndereco = enderecoInstance.count();
        }else{
            enderecoInstance   = new Endereco();
        }
        
        // CONTATOS.
        // Carrega os dados para a alteração do contato.
        def contatoDadosInstance = '';
        if(params.contato != null){
            contatoDadosInstance = Contato.findById(params.contato);
        }else{
            contatoDadosInstance = new Contato();
        }
        // Carrega os contados cadastrados.
        def contatoInstance = Contato.findAllByPessoa(session.pessoa);
        if (contatoInstance != null){
            totalContato = contatoInstance.count();
        }else{
            contatoInstance    = new Contato();
        }
        
        // Verifica se a instituição existe e manda os dados para a tela.
        if (instituicaoEnsinoInstance != null){
            // Avisa que não tem convênio.
            if (!convenioService.possuiConvenioAtivo(colaboradorInstance)) {
                flash.message = "Você não possui convênio. <a href='#'>Solicitar convênio</a>";
            }
            return [instituicaoEnsinoInstance : instituicaoEnsinoInstance,
                    convenioInstance          : convenioDadosInstance,
                    convenioInstanceList      : convenioInstance,
                    convenioInstanceTotal     : totalConvenio,
                    responsavelInstance       : responsavelDadosInstance,
                    responsavelInstanceList   : responsavelInstance,
                    responsavelInstanceTotal  : totalResponsavel,
                    enderecoInstance          : enderecoDadosInstance,
                    enderecoInstanceList      : enderecoInstance,
                    enderecoInstanceTotal     : totalEndereco,
                    contatoInstance           : contatoDadosInstance,
                    contatoInstanceList       : contatoInstance,
                    contatoInstanceTotal      : totalContato];
        }else {
            flash.message="Instituição de Ensino não encontrada.";
            redirect(action: "create");
        }
    };

    def update   = {
        if(!verificaLogon()){
            return;
        }
        def instituicaoEnsinoInstance = InstituicaoEnsino.get(params.id);
        instituicaoEnsinoInstance.password = springSecurityService.encodePassword(params.password)
        instituicaoEnsinoInstance.properties = params;
        //grava as alteraçõe
        if(instituicaoEnsinoInstance.save()){
            flash.message="Instituição de Ensino alterada com sucesso.";
            redirect(action: "edit", id: instituicaoEnsinoInstance.id);
        }else {
            flash.message="Não foi possível alterar a Instituição de Ensino.";
            render(view:"edit",model: [instituicaoEnsinoInstance: instituicaoEnsinoInstance]);
        }
    };

    def duvidas = {
        render(view:"duvidas");
    }

    def programas = {
        render(view:"programas");
    }

    /*
     * Método que verifica se o usuário está logado.
     * Se não estiver logado é redirecionado para home
     */
    private boolean verificaLogon() {
        if(!session["pessoa"]){
            flash.message = "Você precisa estar logado para acessar esta página.";
            redirect(controller:'login', action:'auth');
            return false;
        }

        return true;
    }
}
